'use strict';

// 云函数入口函数
exports.main = async (event, context) => {
  try {
    // 从事件中获取通知信息
    const { userId, type, title, content, openid, periodDuration } = event
    
    console.log('接收到的提醒请求:', {
      userId, 
      type, 
      title, 
      openid: openid ? openid.substring(0, 12) + '...' : 'null',
      content: content ? content.substring(0, 20) + (content.length > 20 ? '...' : '') : 'null'
    })
    
    // 验证必要字段
    if (!userId) {
      return { code: -1, message: '缺少必要参数: userId' }
    }
    
    if (!type) {
      return { code: -1, message: '缺少必要参数: type' }
    }
    
    if (!openid) {
      return { code: -1, message: '缺少必要参数: openid' }
    }
    
    // 检查是否为经期提醒
    if (type === 'period_reminder') {
      // 发送微信订阅消息
      console.log('准备发送微信订阅消息，OpenID:', openid.substring(0, 12) + '...')
      try {
        // 检查环境变量
        console.log('环境变量检查:', {
          WX_APPID: process.env.WX_APPID ? '已设置' : '未设置',
          WX_SECRET: process.env.WX_SECRET ? '已设置' : '未设置',
          WX_TEMPLATE_ID: process.env.WX_TEMPLATE_ID || '未设置'
        })
        
        // 检查是否为测试环境
        const isDevEnv = openid.startsWith('test_openid_');
        
        // 获取小程序的access_token
        let accessToken = '';
        
        if (isDevEnv) {
          console.log('开发测试环境，使用模拟的access_token');
          accessToken = 'test_access_token_' + Date.now().toString().substring(5);
        } else {
          console.log('正在获取access_token...')
          try {
            const accessTokenRes = await uniCloud.httpclient.request(
              `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${process.env.WX_APPID}&secret=${process.env.WX_SECRET}`,
              { dataType: 'json' }
            )
            
            console.log('获取access_token响应:', accessTokenRes.data)
            
            if (!accessTokenRes.data || !accessTokenRes.data.access_token) {
              throw new Error('获取access_token失败: ' + JSON.stringify(accessTokenRes.data));
            }
            
            accessToken = accessTokenRes.data.access_token;
          } catch (tokenError) {
            console.error('获取access_token错误:', tokenError);
            return {
              code: -3,
              message: '获取微信access_token失败',
              error: tokenError.message
            }
          }
        }
        
        // 解析内容中的天数信息
        let daysLeft = 1;
        try {
          if (content && content.includes('天后')) {
            const match = content.match(/(\d+)天后/);
            if (match && match[1]) {
              daysLeft = parseInt(match[1]);
            }
          }
        } catch (parseError) {
          console.warn('解析天数失败:', parseError);
          // 使用默认值，继续执行
        }
        
        // 计算经期结束日期
        const today = new Date();
        const startDate = new Date(today);
        startDate.setDate(today.getDate() + daysLeft);
        
        // 使用提供的经期持续天数或默认值
        const duration = periodDuration || 5;
        const endDate = new Date(startDate);
        endDate.setDate(startDate.getDate() + duration - 1);
        
        // 格式化日期为"MM月DD日"格式
        const formatDate = (date) => {
          const month = (date.getMonth() + 1).toString();
          const day = date.getDate().toString();
          return `${month}月${day}日`;
        };
        
        // 准备备注内容
        let remarkContent = '大姨妈快来了，少吃点凉的~';
        if (isDevEnv) {
          remarkContent = `测试提醒 [${new Date().toLocaleTimeString()}]`;
        }
        
        // 订阅消息模板数据
        const templateId = process.env.WX_TEMPLATE_ID || 'M7hgSK9yXi_5W3JNzrL10G97XQLI99IWp2uk1ESV0iw';
        const templateData = {
          template_id: templateId,
          touser: openid,
          page: 'pages/home/home', // 用户点击消息后跳转的页面
          data: {
            // 根据模板格式调整
            date1: { value: formatDate(startDate) }, // 预计经期日期
            thing2: { value: remarkContent }, // 备注信息
            time3: { value: formatDate(endDate) } // 结束日期
          }
        };
        
        console.log('准备发送的模板消息数据:', JSON.stringify(templateData));
        
        let sendResult;
        
        if (isDevEnv) {
          console.log('开发环境，模拟发送订阅消息');
          sendResult = {
            data: {
              errcode: 0,
              errmsg: 'ok (simulated)'
            }
          };
        } else {
          // 发送订阅消息
          console.log('正在发送订阅消息...')
          sendResult = await uniCloud.httpclient.request(
            `https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=${accessToken}`,
            {
              method: 'POST',
              data: templateData,
              contentType: 'json',
              dataType: 'json'
            }
          );
        }
        
        console.log('订阅消息发送结果：', JSON.stringify(sendResult.data));
        return {
          code: 0,
          message: '提醒发送成功',
          data: {
            wxResult: sendResult.data
          }
        };
      } catch (wxError) {
        console.error('发送微信订阅消息失败:', wxError);
        return {
          code: -2,
          message: '发送微信订阅消息失败',
          error: wxError.message
        };
      }
    } else {
      return {
        code: -1,
        message: '不支持的提醒类型: ' + type
      };
    }
    
  } catch (error) {
    console.error('发送提醒失败:', error);
    // 返回错误信息
    return {
      code: -2,
      message: '发送提醒失败',
      error: error.message
    };
  }
}